package com.clstu.tansaction;

import com.clstu.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 演示jdbc 使用开启事务和提交事务
 */
public class Transaction_ {
    public static void main(String[] args) {
        /*
        注意;在jdbc的连接中,默认是没有开启事务的,即执行一个操作就会自动提交
         */
        PreparedStatement preparedStatement=null;
        Connection connection=null;
        try {
            connection = JDBCUtils.getConnection();//模拟along 给mkbk转100(两个操作都必须完成才算成功)
            connection.setAutoCommit(false);//关闭自动提交,即开启事务
            String sql = "update account set balance = balance - 100 where name ='along'";
            String sql2 = "update account set balance = balance + 100 where name ='mkbk'";
            preparedStatement = connection.prepareStatement(sql);
            int i = preparedStatement.executeUpdate();
//            i=i/0;//故意在这里制造异常,
            /*
               在没有开启事务的情况下,自动提交,只执行了上一条操作,但是却没有执行下一句话,导致了数据不一致
               开启了事务之后,即使有异常,因为没有提交,也不会导致数据的不一致
             */
            int i1 = preparedStatement.executeUpdate(sql2);
            connection.commit();//如果执行到这里,说明2句话都执行完了,可以提交
        } catch (SQLException e) {
            try {
                connection.rollback();//如果因为异常没有执行成功,就回滚,撤销操作,防止数据不一致
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //关闭资源
            JDBCUtils.close(null,preparedStatement,connection);
        }
    }
}
